var maxProduct = function(nums) {
  const len = nums.length;
  let max = nums[0];

  // dp[i][0]表示截止到i时，最大乘积，
  // dp[i][1]表示截止到i时，最小乘积，
  // 他俩都是绝对值最大的情况，遇到符号就可能“翻盘”
  const dp = new Array(len).fill(0).map(() => new Array(2));
  for (let i = 0; i < len; i++) {
    for (let j = 0; j < 2; j++) {
      dp[i][j] = nums[i];
    }
  }

  for (let i = 1; i < len; i++) {
    dp[i][0] = Math.max(dp[i][0], nums[i] * dp[i - 1][0], nums[i] * dp[i - 1][1]);
    dp[i][1] = Math.min(dp[i][1], nums[i] * dp[i - 1][1], nums[i] * dp[i - 1][0]);
    max = Math.max(dp[i][0], max);
  }

  return max;
};

const  nums = [2,3,-2,4];
const nums2 = [-2, 3, -4];
console.log(maxProduct(nums)) // 6
console.log(maxProduct(nums2)) // 24